package utils

import (
	"context"
	"errors"
	"time"

	"github.com/rs/zerolog"

	"github.com/go-redis/redis/v8"
)

// RedisStore 实现 base64Captcha.Store 接口
type RedisStore struct {
	client     *redis.Client
	Prefix     string        // 键前缀（如 "captcha:"）
	expiration time.Duration // 验证码过期时间
}

func NewRedisStore(client *redis.Client, prefix string, expiration time.Duration) (*RedisStore, error) {
	if client == nil {
		return nil, errors.New("redis client is nil")
	}
	return &RedisStore{
		client:     client,
		Prefix:     prefix,
		expiration: expiration,
	}, nil
}

// Set 存储验证码到 Redis
func (s *RedisStore) Set(id string, value string) error {
	key := s.Prefix + id
	if err := s.client.Set(context.Background(), key, value, s.expiration).Err(); err != nil {
		zerolog.DefaultContextLogger.Error().AnErr("保存验证码到redis错误===", err).Msg("")
		return err
	}
	zerolog.DefaultContextLogger.Info().Msgf("存储成功,key===%s, value===%s", key, value)
	return nil
}

// Get 从 Redis 获取验证码（不删除）
func (s *RedisStore) Get(id string, clear bool) string {
	key := s.Prefix + id
	zerolog.DefaultContextLogger.Info().Msgf("验证码的key===%s", key)
	val, err := s.client.Get(context.Background(), key).Result()
	if err != nil {
		zerolog.DefaultContextLogger.Error().AnErr("从redis中获取验证码错误===", err).Msg("")
		return ""
	}
	// 如果需验证后删除（clear=true），这里不主动删除，由业务逻辑控制
	return val
}

// Verify 校验验证码并删除（根据 clear 参数决定）
func (s *RedisStore) Verify(id, answer string, clear bool) bool {
	key := s.Prefix + id
	stored := s.Get(id, false)
	zerolog.DefaultContextLogger.Info().Msgf("校验验证码的key===%s", key)
	if stored == "" || stored != answer {
		zerolog.DefaultContextLogger.Info().Msgf("验证码校验失败(过期或者不匹配)===%s,===%s", stored, answer)
		return false
	}

	if clear {
		count, _ := s.client.Del(context.Background(), key).Result()
		zerolog.DefaultContextLogger.Info().Msgf("验证码正确,执行删除key===%s,数量===%d", key, count)
	}
	return true
}
